package com.zxy.zxyrpc;

import com.zxy.zxyrpc.config.RegistryConfig;
import com.zxy.zxyrpc.config.RpcConfig;
import com.zxy.zxyrpc.constant.RpcConstant;
import com.zxy.zxyrpc.registry.Registry;
import com.zxy.zxyrpc.registry.RegistryFactory;
import com.zxy.zxyrpc.utils.ConfigUtils;
import lombok.extern.slf4j.Slf4j;

/**
 * 全局配置对象
 *
 * @author zxy
 * @since 2025/5/11
 **/
@Slf4j
public class RpcApplication {

    // rpc配置对象
    private static volatile RpcConfig rpcConfig;

    /**
     * 框架初始化（可以和下面的init方法合并）
     *
     * @param newRpcConfig 自定义配置类初始化
     */
    private static void init(RpcConfig newRpcConfig) {
        rpcConfig = newRpcConfig;
        log.info("RPC 初始化, config = {}", newRpcConfig);

        RegistryConfig registryConfig = rpcConfig.getRegistryConfig();
        Registry registry = RegistryFactory.getInstance(registryConfig.getRegistry());
        registry.init(registryConfig);
        log.info("注册中心初始化, config = {}", registryConfig);

        // 创建并注册 ShoutDown Hook, JVM 退出时执行的操作
        Runtime.getRuntime().addShutdownHook(new Thread(registry::destroy));
    }

    /**
     * 配置文件初始化
     */
    public static void init() {
        RpcConfig newRpcConfig;
        try {
            newRpcConfig = ConfigUtils.loadConfig(RpcConfig.class, RpcConstant.DEFAULT_CONFIG_PREFIX_RPC);
        } catch (Exception e) {
            newRpcConfig = new RpcConfig();
        }
        init(newRpcConfig);
    }

    /**
     * 获取RPC配置（双检锁单列模式，懒加载）
     */
    public static RpcConfig getRpcConfig() {
        if (rpcConfig == null) {
            synchronized (RpcApplication.class) {
                if (rpcConfig == null) {
                    init();
                }
            }
        }
        return rpcConfig;
    }
}
